/* * init.c - C source for GNU CHESS for Windows * * Copyright (c) 1988,1989,1990 John Stanback * Copyright (c) 1992 Free Software Foundation * Additions for the Windows version Copyright (c) 1996 Conor McCarthy * * This file is part of GNU CHESS. * * GNU Chess is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GNU Chess is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Chess; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "gnuchess.h" #include "ttable.h" #ifdef HAVE_GETTIMEOFDAY #include #endif extern SHORT CompColorExt,WhoseTurnExt,CompMoveExt; extern SHORT notime; extern SHORT selected; extern DWORD CustCols[16]; SHORT WinSizeX,WinSizeY,WinPosX,WinPosY; RECT wr; SHORT maximized; char lpStatic[]="STATIC"; char IniFile[]="gnuchess.ini"; char hexuint[]="%06X"; char shortfs[]="%hd"; char BrdSection[]="board"; char OptSection[]="options"; char skillsectn[]="skill"; char szboardsize[]="boardsize"; char szsquarebd[]="squarebd"; char szwinsizeX[]="winsizeX"; char szwinsizeY[]="winsizeY"; char szwinposX[]="winposX"; char szwinposY[]="winposY"; char szmaximized[]="maximized"; char szbkgrnd[]="background"; char szwhitesq[]="whitesquare"; char szblacksq[]="blacksquare"; char szwhitepc[]="whitepiece"; char szblackpc[]="blackpiece"; char sztext[]="text"; char szedge[]="edge"; char szcustcols[]="cc00"; char szbeep[]="beep"; char szcoords[]="coords"; char szstats[]="stats"; char szbook[]="book"; char szhash[]="hash"; char szhdepth[]="hashdepth"; char szmvlim[]="movelimit"; char szWA[]="WAwindow"; char szWB[]="WBwindow"; char szWX[]="WXwindow"; char szBA[]="BAwindow"; char szBB[]="BBwindow"; char szBX[]="BXwindow"; char szcontempt[]="contempt"; char szmaterial[]="material"; char szrcptr[]="recapture"; char szthreat[]="threat"; char szpvs[]="pvs"; char szne[]="neweval"; char szgamein[]="gamein"; char szXCmv0[]="XCmoves0"; char szXCmin0[]="XCminutes0"; char szXCmv1[]="XCmoves1"; char szXCmin1[]="XCminutes1"; char szXCmv2[]="XCmoves2"; char szXCmin2[]="XCminutes2"; char szXC[]="XC"; char szMRT[]="MaxResponseTime"; char szdither[]="dither"; char szeasy[]="easy"; char szmaxdepth[]="maxdepth"; char sznull[]=""; DWORD CCdefs[16]={CBLACK,BLUE,GREEN,CYAN,RED,PINK,YELLOW,PALEGRAY,DARKGRAY, DARKBLUE,DARKGREEN,DARKCYAN,DARKRED,DARKPINK,BROWN,CWHITE}; /* .... MOVE GENERATION VARIABLES AND INITIALIZATIONS .... */ SHORT distdata[64][64], taxidata[64][64]; #ifdef KILLT /* put moves to the center first */ void Initialize_killt (void) { register UTSHORT f, t, s; register SHORT d; for (f = 0; f < 64; f++) for (t = 0; t < 64; t++) { d = taxidata[f][0x1b]; if (taxidata[f][0x1c] < d) d = taxidata[f][0x1c]; if (taxidata[f][0x23] < d) d = taxidata[f][0x23]; if (taxidata[f][0x24] < d) d = taxidata[f][0x24]; s = d; d = taxidata[t][0x1b]; if (taxidata[t][0x1c] < d) d = taxidata[t][0x1c]; if (taxidata[t][0x23] < d) d = taxidata[t][0x23]; if (taxidata[t][0x24] < d) d = taxidata[t][0x24]; s -= d; killt[(f << 8) | t] = s; killt[(f << 8) | t | 0x80] = s; } } #endif void Initialize_dist (void) { register SHORT a, b, d, di; for (a = 0; a < 64; a++) for (b = 0; b < 64; b++) { d = abs (column (a) - column (b)); di = abs (row (a) - row (b)); taxidata[a][b] = d + di; distdata[a][b] = (d > di ? d : di); } #ifdef KILLT Initialize_killt (); #endif } const SHORT Stboard[64] = {rook, knight, bishop, queen, king, bishop, knight, rook, pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pawn, pawn, pawn, pawn, pawn, pawn, pawn, pawn, rook, knight, bishop, queen, king, bishop, knight, rook}; const SHORT Stcolor[64] = {white, white, white, white, white, white, white, white, white, white, white, white, white, white, white, white, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, neutral, black, black, black, black, black, black, black, black, black, black, black, black, black, black, black, black}; SHORT board[64], color[64]; /* given epsquare, from where can a pawn be taken? */ const SHORT epmove1[64] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 24, 25, 26, 27, 28, 29, 30, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 32, 33, 34, 35, 36, 37, 38, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}; const SHORT epmove2[64] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 25, 26, 27, 28, 29, 30, 31, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 33, 34, 35, 36, 37, 38, 39, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63}; /* * nextpos[piece][from-square] , nextdir[piece][from-square] gives vector of * positions reachable from from-square in ppos with piece such that the * sequence ppos = nextpos[piece][from-square]; pdir = * nextdir[piece][from-square]; u = ppos[sq]; do { u = ppos[u]; if(color[u] * != neutral) u = pdir[u]; } while (sq != u); will generate the sequence of * all squares reachable from sq. * * If the path is blocked u = pdir[sq] will generate the continuation of the * sequence in other directions. */ UCHAR nextpos[8][64][64]; UCHAR nextdir[8][64][64]; /* * ptype is used to separate white and black pawns, like this; ptyp = * ptype[side][piece] piece can be used directly in nextpos/nextdir when * generating moves for pieces that are not black pawns. */ const SHORT ptype[2][8] = { { no_piece, pawn, knight, bishop, rook, queen, king, no_piece }, { no_piece, bpawn, knight, bishop, rook, queen, king, no_piece } }; /* data used to generate nextpos/nextdir */ static const SHORT direc[8][8] = { { 0, 0, 0, 0, 0, 0, 0, 0 }, { 10, 9, 11, 0, 0, 0, 0, 0 }, { 8, -8, 12, -12, 19, -19, 21, -21 }, { 9, 11, -9, -11, 0, 0, 0, 0 }, { 1, 10, -1, -10, 0, 0, 0, 0 }, { 1, 10, -1, -10, 9, 11, -9, -11 }, { 1, 10, -1, -10, 9, 11, -9, -11 }, { -10, -9, -11, 0, 0, 0, 0, 0 } }; static const SHORT max_steps[8] = {0, 2, 1, 7, 7, 7, 1, 2}; static const SHORT nunmap[120] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, 16, 17, 18, 19, 20, 21, 22, 23, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, 32, 33, 34, 35, 36, 37, 38, 39, -1, -1, 40, 41, 42, 43, 44, 45, 46, 47, -1, -1, 48, 49, 50, 51, 52, 53, 54, 55, -1, -1, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; int InitFlag = false; void Initialize_moves (void) /* * This procedure pre-calculates all moves for every piece from every square. * This data is stored in nextpos/nextdir and used later in the move * generation routines. */ { SHORT ptyp, po, p0, d, di, s, delta; UCHAR *ppos, *pdir; SHORT dest[8][8]; SHORT steps[8]; SHORT sorted[8]; for (ptyp = 0; ptyp < 8; ptyp++) for (po = 0; po < 64; po++) for (p0 = 0; p0 < 64; p0++) { nextpos[ptyp][po][p0] = (UCHAR) po; nextdir[ptyp][po][p0] = (UCHAR) po; } for (ptyp = 1; ptyp < 8; ptyp++) for (po = 21; po < 99; po++) if (nunmap[po] >= 0) { ppos = nextpos[ptyp][nunmap[po]]; pdir = nextdir[ptyp][nunmap[po]]; /* dest is a function of direction and steps */ for (d = 0; d < 8; d++) { dest[d][0] = nunmap[po]; delta = direc[ptyp][d]; if (delta != 0) { p0 = po; for (s = 0; s < max_steps[ptyp]; s++) { p0 = p0 + delta; /* * break if (off board) or (pawns only move two * steps from home square) */ if ((nunmap[p0] < 0) || (((ptyp == pawn) || (ptyp == bpawn)) && ((s > 0) && ((d > 0) || (Stboard[nunmap[po]] != pawn))))) break; else dest[d][s] = nunmap[p0]; } } else s = 0; /* * sort dest in number of steps order currently no sort * is done due to compability with the move generation * order in old gnu chess */ steps[d] = s; for (di = d; s > 0 && di > 0; di--) if (steps[sorted[di - 1]] == 0) /* should be: < s */ sorted[di] = sorted[di - 1]; else break; sorted[di] = d; } /* * update nextpos/nextdir, pawns have two threads (capture * and no capture) */ p0 = nunmap[po]; if (ptyp == pawn || ptyp == bpawn) { for (s = 0; s < steps[0]; s++) { ppos[p0] = (UCHAR) dest[0][s]; p0 = dest[0][s]; } p0 = nunmap[po]; for (d = 1; d < 3; d++) { pdir[p0] = (UCHAR) dest[d][0]; p0 = dest[d][0]; } } else { pdir[p0] = (UCHAR) dest[sorted[0]][0]; for (d = 0; d < 8; d++) for (s = 0; s < steps[sorted[d]]; s++) { ppos[p0] = (UCHAR) dest[sorted[d]][s]; p0 = dest[sorted[d]][s]; if (d < 7) pdir[p0] = (UCHAR) dest[sorted[d + 1]][0]; /* * else is already initialized */ } } } } void NewGame (void) /* * Reset the board and other variables to start a new game. */ { SHORT l; #ifdef HAVE_GETTIMEOFDAY struct timeval tv; #endif #ifdef CLIENT if(GameCnt >0)ListGame(); fflush(stdout); #endif compptr = oppptr = 0; stage = stage2 = -1; /* the game is not yet started */ notime = true; if (flag.reverse)InvalidateRect(hWnd,0,true); flag.illegal=flag.mate=flag.quit=flag.bothsides=flag.onemove=false; flag.force=flag.back=flag.musttimeout=flag.reverse=false; #ifdef DEBUG flag.nott = flag.noft = flag.nocache = false; #endif computer = black; opponent = white; GenCnt = NodeCnt = et0 = epsquare = XCmore = 0; xwndw = BXwindow; if (!MaxSearchDepth) MaxSearchDepth = MAXDEPTH - 1; GameCnt = 0; Game50 = 1; hint = 0x0C14; selected=0; ZeroRPT (); Developed[white] = Developed[black] = false; castld[white] = castld[black] = false; PawnThreat[0] = CptrFlag[0] = false; Pscore[0] = Tscore[0] = 12000; for (l = 0; l < TREE; l++) Tree[l].f = Tree[l].t = 0; if (!InitFlag) InitHashCode((unsigned int)1); for (l = 0; l < 64; l++) { board[l] = Stboard[l]; color[l] = Stcolor[l]; Mvboard[l] = 0; } InitializeStats (); #ifdef HAVE_GETTIMEOFDAY gettimeofday(&tv, NULL); time0 = tv.tv_sec*100+tv.tv_usec/10000; #else time0 = GetTickCount(); #endif ElapsedTime (1); flag.regularstart = true; Book = flag.usebook ? BOOKFAIL : 0; TimeControl.clock[white] = TimeControl.clock[black] = 0; SetTimeControl(); player^=1; UpdateClocks(); player^=1; UpdateClocks(); if (!InitFlag) { GetOpenings (); #ifdef CACHE etab[0] = (struct etable *)malloc(ETABLE*sizeof(struct etable)); etab[1] = (struct etable *)malloc(ETABLE*sizeof(struct etable)); if(etab[0] == NULL || etab[1] == NULL){ ShowMessage(CP[70]);Exit(1);} #endif #if ttblsz Initialize_ttable(); #endif InitFlag = true; } #if ttblsz ZeroTTable(0); #endif /* ttblsz */ #ifdef CACHE memset ((CHAR *) etab[0], 0, ETABLE*sizeof(struct etable)); memset ((CHAR *) etab[1], 0, ETABLE*sizeof(struct etable)); #endif #ifdef NODITHER PCRASH = PCRASHS; PCENTER = PCENTERS; #else PCRASH = PCRASHS + (dither?(rand() % PCRASHV):0); PCENTER = PCENTERS + (dither?(rand() % PCENTERV):0); #endif ShowPlayers(); SetWindowText(hComputerMove,""); return; } void InitConst (CHAR *lang) { FILE *constfile; CHAR s[512]; CHAR sl[5]; int len, entry; CHAR *p, *q; flag.illegal=flag.mate=flag.quit=flag.bothsides=flag.onemove=flag.force=false; flag.autolist=flag.back=flag.musttimeout=false; flag.searching=flag.editing=flag.replay=false; constfile = fopen (LANGFILE, "r"); if (!constfile) { constfile = fopen("\\gnuchess\\bin\\gnuchess.lan", "r"); } if (!constfile) { ShowMessage("NO LANGFILE (file gnuchess.lan not found)"); exit (1); } while (fgets (s, sizeof (s), constfile)) { if (s[0] == '!') continue; len = strlen (s); for (q = &s[len]; q > &s[8]; q--) if (*q == '}') break; if (q == &s[8]) { ShowMessage ("Error in gnuchess.lan"); exit (1); } *q = '\0'; if (s[3] != ':' || s[7] != ':' || s[8] != '{') { sprintf (msg,"Langfile format error %s", s); ShowMessage(msg); exit (1); } s[3] = s[7] = '\0'; if (lang == NULL) { lang = sl; strcpy (sl, &s[4]); } if (strcmp (&s[4], lang)) continue; entry = atoi (s); if (entry < 0 || entry >= CPSIZE) { ShowMessage ("Langfile number error"); exit (1); } for (q = p = &s[9]; *p; p++) { if (*p != '\\') { *q++ = *p; } else if (*(p + 1) == 'n') { *q++ = '\n'; p++; } } *q = '\0'; if (entry < 0 || entry > 255) { sprintf (msg,"Langfile error %d", entry); ShowMessage (msg); exit (1); } CP[entry] = (CHAR *) malloc ((unsigned) strlen (&s[9]) + 1); if (CP[entry] == NULL) { ShowMessage ("Insufficient memory"); exit (1); } strcpy (CP[entry], &s[9]); } fclose (constfile); } void GetMetrics(void) { HDC hDC; HANDLE hOld,hSysFont; TEXTMETRIC tm; SIZE size; RECT rc; GetWindowRect(GetDesktopWindow(),&rc); hDC=GetDC(hWnd); hFont=CreateFont ( (rc.right-rc.left)/50, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH | FF_SWISS, "Helv" ); hSysFont=GetStockObject(SYSTEM_FONT); hOld=SelectObject(hDC,hFont); GetTextMetrics(hDC,&tm); LineSpace=tm.tmHeight; CharWidth=tm.tmAveCharWidth; SelectObject(hDC,hSysFont); GetTextMetrics(hDC,&tm); SLineSpace=tm.tmHeight; GetTextExtentPoint(hDC,CP[74],17,&size); CompColorExt=size.cx+25; GetTextExtentPoint(hDC,"It is White's move",18,&size); WhoseTurnExt=size.cx+25; GetTextExtentPoint(hDC,"My move is a7a8q",16,&size); CompMoveExt=size.cx+4; SelectObject(hDC,hOld); ReleaseDC(hWnd,hDC); } void InitScreen(void) { SHORT x,y,marginF,marginB,lengthF,lengthB; if (squarebd) switch (boardsize) { case SMALL: sqwidthF=sqwidthB=sqdepth=bmsize=40; break; case MEDIUM: sqwidthF=sqwidthB=sqdepth=bmsize=60; break; case LARGE: sqwidthF=sqwidthB=sqdepth=bmsize=80; } else switch (boardsize) { case SMALL: sqwidthF=60; sqwidthB=42; sqdepth=40; bmsize=40; break; case MEDIUM: sqwidthF=90; sqwidthB=63; sqdepth=60; bmsize=60; break; case LARGE: sqwidthF=120; sqwidthB=84; sqdepth=80; bmsize=80; } deltaX=(sqwidthF-sqwidthB)*8; for (y=0;y<8;y++) { marginF=deltaX*y/16; marginB=deltaX*(y+1)/16; lengthF=sqwidthF*8-(marginF<<1); lengthB=sqwidthF*8-(marginB<<1); marginF+=LEFTMARGIN; marginB+=LEFTMARGIN; for (x=0;x<8;x++) { squares[x][y][0].x=marginF+lengthF*x/8; squares[x][y][0].y=(8-y)*sqdepth+BACKMARGIN; squares[x][y][1].x=marginF+lengthF*(x+1)/8; squares[x][y][1].y=(8-y)*sqdepth+BACKMARGIN; squares[x][y][2].x=marginB+lengthB*(x+1)/8; squares[x][y][2].y=(7-y)*sqdepth+BACKMARGIN; squares[x][y][3].x=marginB+lengthB*x/8; squares[x][y][3].y=(7-y)*sqdepth+BACKMARGIN; pieceloc[x+(y<<3)].x=lengthF/16-bmsize/2+squares[x][y][0].x; pieceloc[x+(y<<3)].y=squares[x][y][2].y; } } boardpg[0]=squares[0][0][0]; boardpg[1]=squares[7][0][1]; boardpg[2]=squares[7][7][2]; boardpg[3]=squares[0][7][3]; } void CreateStatics(void) { SHORT CompMoveXpos,YPos; YPos=BACKMARGIN+sqdepth*8+LineSpace+BRD_EDGE; hComputerColor = CreateWindow (lpStatic, NULL, WS_CHILD | SS_LEFT | WS_VISIBLE, LEFTMARGIN, YPos, CompColorExt, SLineSpace, hWnd, (HMENU)0, hInst, NULL); hWhoseTurn = CreateWindow (lpStatic, NULL, WS_CHILD | SS_LEFT | WS_VISIBLE, LEFTMARGIN+CompColorExt, YPos, WhoseTurnExt, SLineSpace, hWnd, (HMENU)1, hInst, NULL); hInCheck = CreateWindow (lpStatic, NULL, WS_CHILD | SS_LEFT | WS_VISIBLE, LEFTMARGIN+CompColorExt+WhoseTurnExt, YPos, 120, SLineSpace, hWnd, (HMENU)2, hInst, NULL); hComputerMove = CreateWindow (lpStatic, NULL, WS_CHILD | SS_CENTER | WS_VISIBLE, CompMoveXpos=LEFTMARGIN+sqwidthB*8+deltaX/2+(20>>squarebd), 65,CompMoveExt, SLineSpace, hWnd, (HMENU)3, hInst, NULL); hClockBlack = CreateWindow ( lpStatic, NULL, WS_CHILD | SS_CENTER | WS_VISIBLE, CompMoveXpos+(CompMoveExt-60)/2, 30, 60, SLineSpace, hWnd, (HMENU)4, hInst, NULL); hClockWhite = CreateWindow ( lpStatic, NULL, WS_CHILD | SS_CENTER | WS_VISIBLE, CompMoveXpos+(CompMoveExt-60)/2, 120, 60, SLineSpace, hWnd, (HMENU)5, hInst, NULL); hBlack = CreateWindow ( lpStatic, CP[41], WS_CHILD | SS_CENTER | WS_VISIBLE, CompMoveXpos+(CompMoveExt-60)/2, 10, 60, SLineSpace, hWnd, (HMENU)6, hInst, NULL); hWhite = CreateWindow ( lpStatic, CP[40], WS_CHILD | SS_CENTER | WS_VISIBLE, CompMoveXpos+(CompMoveExt-60)/2, 100, 60, SLineSpace, hWnd, (HMENU)7, hInst, NULL); hDepth = CreateWindow ( lpStatic, NULL, WS_CHILD | SS_CENTER | WS_VISIBLE, CompMoveXpos+(CompMoveExt-80)/2, 150, 80, SLineSpace, hWnd, (HMENU)1010, hInst, NULL); } void MoveStatics(void) { SHORT CompMoveXpos; MoveWindow(hComputerColor,LEFTMARGIN, BACKMARGIN+sqdepth*8+20, CompColorExt, SLineSpace, false); MoveWindow(hWhoseTurn,LEFTMARGIN+CompColorExt, BACKMARGIN+sqdepth*8+20, WhoseTurnExt, SLineSpace, false); MoveWindow(hInCheck,LEFTMARGIN+CompColorExt+WhoseTurnExt, BACKMARGIN+sqdepth*8+20,120, SLineSpace, false); MoveWindow(hComputerMove,CompMoveXpos=LEFTMARGIN+sqwidthB*8+deltaX/2+ (20>>squarebd), 65, CompMoveExt, SLineSpace, false); MoveWindow(hClockBlack,CompMoveXpos+(CompMoveExt-60)/2, 30, 60, SLineSpace, false); MoveWindow(hClockWhite,CompMoveXpos+(CompMoveExt-60)/2, 120, 60, SLineSpace, false); MoveWindow(hBlack,CompMoveXpos+(CompMoveExt-60)/2, 10, 60, SLineSpace, false); MoveWindow(hWhite,CompMoveXpos+(CompMoveExt-60)/2, 100, 60, SLineSpace, false); MoveWindow(hDepth,CompMoveXpos+(CompMoveExt-80)/2, 150, 80, SLineSpace, false); } BOOL LoadSettings(void) { SHORT i; boardsize=GetPrivateProfileInt(BrdSection,szboardsize,SMALL,IniFile); squarebd=GetPrivateProfileInt(BrdSection,szsquarebd,0,IniFile); WinPosX=GetPrivateProfileInt(BrdSection,szwinposX,0,IniFile); WinPosY=GetPrivateProfileInt(BrdSection,szwinposY,0,IniFile); WinSizeX=GetPrivateProfileInt(BrdSection,szwinsizeX,0,IniFile); WinSizeY=GetPrivateProfileInt(BrdSection,szwinsizeY,0,IniFile); GetPrivateProfileString(BrdSection,szbkgrnd,sznull,msg,sizeof(msg),IniFile); clrBackGround = msg[0] ? strtoul(msg,0,16) : BROWN; GetPrivateProfileString(BrdSection,szblacksq,sznull,msg,sizeof(msg),IniFile); clrBlackSquare = msg[0] ? strtoul(msg,0,16) : DARKGREEN; GetPrivateProfileString(BrdSection,szwhitesq,sznull,msg,sizeof(msg),IniFile); clrWhiteSquare = msg[0] ? strtoul(msg,0,16) : PALEGRAY; GetPrivateProfileString(BrdSection,szblackpc,sznull,msg,sizeof(msg),IniFile); clrBlackPiece = msg[0] ? strtoul(msg,0,16) : DARKRED; GetPrivateProfileString(BrdSection,szwhitepc,sznull,msg,sizeof(msg),IniFile); clrWhitePiece = msg[0] ? strtoul(msg,0,16) : CWHITE; GetPrivateProfileString(BrdSection,sztext,sznull,msg,sizeof(msg),IniFile); clrText = msg[0] ? strtoul(msg,0,16) : CBLACK; GetPrivateProfileString(BrdSection,szedge,sznull,msg,sizeof(msg),IniFile); clrEdge = msg[0] ? strtoul(msg,0,16) : CBLACK; for (i=0;i<16;i++) { szcustcols[2]=(char)i+'0'; GetPrivateProfileString(BrdSection,szcustcols,sznull,msg,sizeof(msg),IniFile); if (msg[0]) CustCols[i]=strtoul(msg,0,16); else CustCols[i]=CCdefs[i]; } flag.beep=GetPrivateProfileInt(OptSection,szbeep,1,IniFile); flag.coords=GetPrivateProfileInt(OptSection,szcoords,1,IniFile); flag.post=GetPrivateProfileInt(OptSection,szstats,0,IniFile); flag.usebook=GetPrivateProfileInt(OptSection,szbook,1,IniFile); flag.hash=GetPrivateProfileInt(OptSection,szhash,1,IniFile); HashDepth=GetPrivateProfileInt(OptSection,szhdepth,HASHDEPTH,IniFile); HashMoveLimit=GetPrivateProfileInt(OptSection,szmvlim,HASHMOVELIMIT,IniFile); WAwindow=GetPrivateProfileInt(OptSection,szWA,WAWNDW,IniFile); WBwindow=GetPrivateProfileInt(OptSection,szWB,WBWNDW,IniFile); WXwindow=GetPrivateProfileInt(OptSection,szWX,WXWNDW,IniFile); BAwindow=GetPrivateProfileInt(OptSection,szBA,BAWNDW,IniFile); BBwindow=GetPrivateProfileInt(OptSection,szBB,BBWNDW,IniFile); BXwindow=GetPrivateProfileInt(OptSection,szBX,BXWNDW,IniFile); contempt=GetPrivateProfileInt(OptSection,szcontempt,0,IniFile); flag.material=GetPrivateProfileInt(OptSection,szmaterial,1,IniFile); flag.rcptr=GetPrivateProfileInt(OptSection,szrcptr,1,IniFile); flag.threat=GetPrivateProfileInt(OptSection,szthreat,1,IniFile); flag.pvs=GetPrivateProfileInt(OptSection,szpvs,1,IniFile); flag.neweval=GetPrivateProfileInt(OptSection,szne,1,IniFile); flag.gamein=GetPrivateProfileInt(OptSection,szgamein,0,IniFile); XCmoves[0]=GetPrivateProfileInt(skillsectn,szXCmv0,0,IniFile); XCminutes[0]=GetPrivateProfileInt(skillsectn,szXCmin0,0,IniFile); XCmoves[1]=GetPrivateProfileInt(skillsectn,szXCmv1,0,IniFile); XCminutes[1]=GetPrivateProfileInt(skillsectn,szXCmin1,0,IniFile); XCmoves[2]=GetPrivateProfileInt(skillsectn,szXCmv2,0,IniFile); XCminutes[2]=GetPrivateProfileInt(skillsectn,szXCmin2,0,IniFile); XC=0; for (i=0;i<3;i++) { if (XCmoves[i] && XCminutes[i])XC++; else break; } GetPrivateProfileString(skillsectn,szMRT,"3000",msg,sizeof(msg),IniFile); MaxResponseTime=strtol(msg,0,10); dither=GetPrivateProfileInt(skillsectn,szdither,0,IniFile); flag.easy=GetPrivateProfileInt(skillsectn,szeasy,1,IniFile); MaxSearchDepth=GetPrivateProfileInt(skillsectn,szmaxdepth,MAXDEPTH,IniFile); return GetPrivateProfileInt(BrdSection,szmaximized,0,IniFile); } void SaveSettings(void) { RECT rect; SHORT i; sprintf(msg,shortfs,boardsize); WritePrivateProfileString(BrdSection,szboardsize,msg,IniFile); sprintf(msg,shortfs,squarebd); WritePrivateProfileString(BrdSection,szsquarebd,msg,IniFile); if (wr.right) { sprintf(msg,shortfs,wr.left); WritePrivateProfileString(BrdSection,szwinposX,msg,IniFile); sprintf(msg,shortfs,wr.top); WritePrivateProfileString(BrdSection,szwinposY,msg,IniFile); sprintf(msg,shortfs,wr.right-wr.left); WritePrivateProfileString(BrdSection,szwinsizeX,msg,IniFile); sprintf(msg,shortfs,wr.bottom-wr.top); WritePrivateProfileString(BrdSection,szwinsizeY,msg,IniFile); } sprintf(msg,shortfs,maximized); WritePrivateProfileString(BrdSection,szmaximized,msg,IniFile); sprintf(msg,hexuint,clrBackGround); WritePrivateProfileString(BrdSection,szbkgrnd,msg,IniFile); sprintf(msg,hexuint,clrBlackSquare); WritePrivateProfileString(BrdSection,szblacksq,msg,IniFile); sprintf(msg,hexuint,clrWhiteSquare); WritePrivateProfileString(BrdSection,szwhitesq,msg,IniFile); sprintf(msg,hexuint,clrBlackPiece); WritePrivateProfileString(BrdSection,szblackpc,msg,IniFile); sprintf(msg,hexuint,clrWhitePiece); WritePrivateProfileString(BrdSection,szwhitepc,msg,IniFile); sprintf(msg,hexuint,clrText); WritePrivateProfileString(BrdSection,sztext,msg,IniFile); sprintf(msg,hexuint,clrEdge); WritePrivateProfileString(BrdSection,szedge,msg,IniFile); for (i=0;i<16;i++) { sprintf(msg,hexuint,CustCols[i]); sprintf(szcustcols+2,shortfs,i); WritePrivateProfileString(BrdSection,szcustcols,msg,IniFile); } sprintf(msg,shortfs,flag.beep); WritePrivateProfileString(OptSection,szbeep,msg,IniFile); sprintf(msg,shortfs,flag.coords); WritePrivateProfileString(OptSection,szcoords,msg,IniFile); sprintf(msg,shortfs,flag.post); WritePrivateProfileString(OptSection,szstats,msg,IniFile); sprintf(msg,shortfs,flag.usebook); WritePrivateProfileString(OptSection,szbook,msg,IniFile); sprintf(msg,shortfs,flag.hash); WritePrivateProfileString(OptSection,szhash,msg,IniFile); sprintf(msg,shortfs,HashDepth); WritePrivateProfileString(OptSection,szhdepth,msg,IniFile); sprintf(msg,shortfs,HashMoveLimit); WritePrivateProfileString(OptSection,szmvlim,msg,IniFile); sprintf(msg,shortfs,WAwindow); WritePrivateProfileString(OptSection,szWA,msg,IniFile); sprintf(msg,shortfs,WBwindow); WritePrivateProfileString(OptSection,szWB,msg,IniFile); sprintf(msg,shortfs,WXwindow); WritePrivateProfileString(OptSection,szWX,msg,IniFile); sprintf(msg,shortfs,BAwindow); WritePrivateProfileString(OptSection,szBA,msg,IniFile); sprintf(msg,shortfs,BBwindow); WritePrivateProfileString(OptSection,szBB,msg,IniFile); sprintf(msg,shortfs,BXwindow); WritePrivateProfileString(OptSection,szBX,msg,IniFile); sprintf(msg,shortfs,contempt); WritePrivateProfileString(OptSection,szcontempt,msg,IniFile); sprintf(msg,shortfs,flag.material); WritePrivateProfileString(OptSection,szmaterial,msg,IniFile); sprintf(msg,shortfs,flag.rcptr); WritePrivateProfileString(OptSection,szrcptr,msg,IniFile); sprintf(msg,shortfs,flag.threat); WritePrivateProfileString(OptSection,szthreat,msg,IniFile); sprintf(msg,shortfs,flag.pvs); WritePrivateProfileString(OptSection,szpvs,msg,IniFile); sprintf(msg,shortfs,flag.neweval); WritePrivateProfileString(OptSection,szne,msg,IniFile); sprintf(msg,shortfs,flag.gamein); WritePrivateProfileString(OptSection,szgamein,msg,IniFile); sprintf(msg,shortfs,XCmoves[0]); WritePrivateProfileString(skillsectn,szXCmv0,msg,IniFile); sprintf(msg,shortfs,XCminutes[0]); WritePrivateProfileString(skillsectn,szXCmin0,msg,IniFile); sprintf(msg,shortfs,XCmoves[1]); WritePrivateProfileString(skillsectn,szXCmv1,msg,IniFile); sprintf(msg,shortfs,XCminutes[1]); WritePrivateProfileString(skillsectn,szXCmin1,msg,IniFile); sprintf(msg,shortfs,XCmoves[2]); WritePrivateProfileString(skillsectn,szXCmv2,msg,IniFile); sprintf(msg,shortfs,XCminutes[2]); WritePrivateProfileString(skillsectn,szXCmin2,msg,IniFile); sprintf(msg,"%ld",MaxResponseTime); WritePrivateProfileString(skillsectn,szMRT,msg,IniFile); sprintf(msg,shortfs,dither); WritePrivateProfileString(skillsectn,szdither,msg,IniFile); sprintf(msg,shortfs,flag.easy); WritePrivateProfileString(skillsectn,szeasy,msg,IniFile); sprintf(msg,shortfs,MaxSearchDepth); WritePrivateProfileString(skillsectn,szmaxdepth,msg,IniFile); }